﻿<?php
#SPL 
    
    #Uwagi ogolne:
    # metody:
    # -isLink()
    # -isDir()
    # -isDot()
    # -getSize()
    # -getPath()
    # -getPathname()
    # -getFilename()
    # -getType() return: 'file' || 'link' || 'dir'
    # -getATime() czas ostatniego dostepu
    # -getMTime() czas utworzenia
    # -getCTime() czas ostatniej modyfikacji
    
#1. ArrayObject
   /*
    $owoce= array('jablko'=>'zielone',
                  'pomarancza'=>'pomaranczowa',
                  'gruzka'=>'zielonkawa',
                  'cytgryna'=>'zółta');
    $obj = new ArrayObject($owoce);
    $obj->append('malina','czerwona');
    $it=$obj->getIterator();
    foreach ($it as $klucz=>$val)
    {
        echo $klucz .':'.$val.'<br>';
    }
    
    exit; 
    */
    
#2. REKURSYWNY iterator
    
 /*   
    $fruits = array(
                "apple" => "yummy",
                "orange" => "ah ya, nice",
                "grape" => "wow, I love it!",
                 "plum" => array('sdsd'=>'dsfsdf','dsfsdf'=>'sddsf22')
                );

        $veg = array("potato" => "chips", "carrot" => "soup");
        $grocery = array($fruits, $veg);

        #mam tablicę ktora ma w 1 elemencie tablice i w 2 elemencie tablice
        echo"<pre>";
        print_r($grocery );
        echo"</pre>";


        $obj = new ArrayObject( $grocery );

        $it = new RecursiveIteratorIterator( new RecursiveArrayIterator($grocery));

        //wynika t
        foreach ($it as $key=>$val)
        echo $key.":".$val."<br>";
                    //wynika z tego ze traktuje to jak normalna tablice wiec narazielipa
//        apple:yummy
//        orange:ah ya, nice
//        grape:wow, I love it!
//        sdsd:dsfsdf
//        dsfsdf:sddsf22
//        potato:chips
//        carrot:soup  


    exit;
    
   */
   
   
   
   
   
   
   
   
 ##################################################################  
#2b Praktyczne wykorzystanie arrayrecursive iteratora
/*
$tree = array();
$tree[1][2][3] = 'lemon';
$tree[1][4] = 'melon';
$tree[2][3] = 'orange';
$tree[2][5] = 'grape';
$tree[3] = 'pineapple';

echo '<pre>';
print_r($tree);
echo'</pre>';

 
$arrayiter = new RecursiveArrayIterator($tree);
$iteriter = new RecursiveIteratorIterator($arrayiter);
 
foreach ($iteriter as $key => $value) {
  $d = $iteriter->getDepth();
  echo "depth=$d k=$key v=$value\n";
}
 exit;
 */
 /*
The output of this would be:

Array
(
    [1] => Array
        (
            [2] => Array
                (
                    [3] => lemon
                )

            [4] => melon
        )

    [2] => Array
        (
            [3] => orange
            [5] => grape
        )

    [3] => pineapple
)

depth=2 k=3 v=lemon
depth=1 k=4 v=melon
depth=1 k=3 v=orange
depth=1 k=5 v=grape
depth=0 k=3 v=pineapple   
 */
 //czyli takie wyniki jakie chciałem !!!! przeszedł mi po wszystkich elementach tablicy i je pobral poza tym znam klucz i glebokosc
 // to co poznaje to nazwe elementu klicz pod jakim sie znajduje i jego glebokosc.
 // wiec teraz nie znam wszystkich kluczy tzn pelnej sciezki
 
 
 
 ###############################################
 #3. praktyczne zasosowanie recursywnego iteratora
 #wszysko to co dostałem postem filtruje. I tu musze wykorzystać recursywnego iteratora bo okazuje się że postem 
 #można przesłac nieskonczenie wymiarowe tablice
 
/* 
$tree = array();
$tree[0]['państwo']['nazwa'] = 'Polska';
$tree[0]['państwo']['id'] = 1;
$tree[0]['region']['nazwa'] = 'Małopolska';
$tree[0]['region']['id'] = 22;
$tree[0]['miasto']['nazwa'] = 'olkusz';
$tree[0]['miasto']['id'] = 555;

$tree[1]['państwo']['nazwa'] = 'Włochy';
$tree[1]['państwo']['id'] = 1;
$tree[1]['miasto']['nazwa'] = 'rama';
$tree[1]['miasto']['id'] = 8934;


echo '<pre>';
print_r($tree);
echo'</pre>';

 
$arrayiter = new RecursiveArrayIterator($tree);
$iteriter = new RecursiveIteratorIterator($arrayiter);
 
#moge teraz te dane przefiltrowac  
foreach ($iteriter as $key => $value) {
  $d = $iteriter->getDepth();
  echo "depth=$d k=$key v=$value\n";
}
 exit;
                                                                 */
 
##############################################
#4. rekursywnie pobranie sciezek(kuczy) wraz z wartoscia na koncu
 
$tree = array();
$tree[0]['państwo']['nazwa'] = 'Polska';
$tree[0]['państwo']['id'] = 1;
$tree[0]['region']['nazwa'] = 'Małopolska';
$tree[0]['region']['id'] = 22;
$tree[0]['miasto']['nazwa'] = 'olkusz';
$tree[0]['miasto']['id'] = 555;

$tree[1]['państwo']['nazwa'] = 'Włochy';
$tree[1]['państwo']['id'] = 1;
$tree[1]['miasto']['nazwa'] = 'rama';
$tree[1]['miasto']['id'] = 8934;


echo '<pre>';
print_r($tree);
echo'</pre>';


$iterator = new RecursiveArrayIterator($tree);



function traverseStructure($iterator)
{  
Global $cos; 
while ( $iterator -> valid() ) {
        
        if ( $iterator -> hasChildren() ) 
        {
            #dolozenie do stosu klucza
            $cos=$iterator->key().'->';
            echo  $cos;
            traverseStructure($iterator -> getChildren());
        }
        else
        {
            echo $cos.'PUSTY'.$iterator -> key() . ' : ' . $iterator -> current() .'<br>';  
            //$stos[$id].=$iterator->key().'->'.$iterator -> current();  
        }

        $iterator -> next();
        
    } 
  
} 
  // 0->państwo->nazwa : Polska id : 1 region->nazwa : Małopolska id : 22 miasto->nazwa : olkusz id : 555 1->państwo->nazwa : Włochy id : 1 miasto->nazwa : rama id : 8934 
  
  traverseStructure($iterator); exit;    
    
#1. otwarcie folderu i przeskanowanie go
   /*
    $directory = dirname(__FILE__)."/demos";
    //echo $directory; 
    #D:\wamp\www\testt\spl/demos.
    //$directory='D:/wamp/www/testt/spl/demos';
    $di= new DirectoryIterator($directory);

    foreach ($di as $key=>$val) 
    {
    echo $val.'<br>'; # wypisuje nazwy pkikow i folderow
    }
    echo"<pre>";
 print_r($di);
    echo"</pre>";

    #wynik:    
    #.
    #..
    #11.txt
    #11b.BMP
    #11c.txt
    #222
    #333
   */
   
    #Metody:
    # metody:
    # -isLink()
    # -isDir()
    # -isDot()
    # -getSize()
    # -getPath()
    # -getPathname()
    # -getFilename()
    # -getType() return: 'file' || 'link' || 'dir'
    # -getATime() czas ostatniego dostepu
    # -getMTime() czas utworzenia
    # -getCTime() czas ostatniej modyfikacji
    
    # uwaga - temetody sa przydatne ale mozna inaczej to zrobic pobieram tylko sciezke wraz z nazwą pkiku i wywoluje obietk klasy SPLFileObject i ona ma takie same metody
    
#2. otwarcie folderu,przeskanowanie  pobranie to tablicy nazwy folderow i plikow
    /*
    echo 'TEST direct iterator';
    $directory = dirname(__FILE__)."/demos";
    $di= new DirectoryIterator($directory);
    echo"<pre>";
    var_dump($di);
    echo"</pre>";
       
    $dirs = array();
    foreach ($di as $obiekt) 
    {
     if($obiekt->isDir() && !$obiekt->isDot() && !$obiekt->isLink())
     {
         $dirs[] = $obiekt->getFilename();
     } 
     else  
     {
        if(!$obiekt->isDot() && !$obiekt->isLink()) 
         {
             $pliki[]= $obiekt->getFilename();
             $sciezki[]=$obiekt->getPathname();
         }    
     }
    
    }
echo"<pre>";    
    echo "katalogi:<br>";
    print_r($dirs);
    echo "<br>pliki <br>";
    print_r($pliki);   
    echo "<br>pełne ścieżkiąą: <br>";
    print_r($sciezki); 
echo"</pre>";
*/



# 
/*
$it = new RecursiveDirectoryIterator("/tmp");
foreach(new RecursiveIteratorIterator($it) as $file) {
echo $file . "\n";
}
*/



# Recursive direct iterator
    #pobieranie wszysktkich plikow wraz ze sciezkami z lokalizacji
    /*    
    D:\xamp\xampp\htdocs\test\spl\demos\11.txt
    D:\xamp\xampp\htdocs\test\spl\demos\11b.BMP
    D:\xamp\xampp\htdocs\test\spl\demos\11c.txt
    D:\xamp\xampp\htdocs\test\spl\demos\222\22dfsds.txt
    */

    /*
    $directory = dirname(__FILE__)."\demos";
    $it = new RecursiveDirectoryIterator( $directory );
    foreach(new RecursiveIteratorIterator($it) as $file) {
        echo'<pre>';
    echo $file . "\n";
    echo'</pre>';
    }
    */


# Spl File object , spl file info     
   # $file= new SplFileObject('test.txt');
    
    
 //$file->seek(3);
//echo $file->current();
 #print_r( $file->getFileInfo());
 
 #wypisanmie zawartosci pliku wraz z numerowaniem linijek
  /*
 foreach ($file as $line)
        {
            echo $file->key().'. '.$line;
            
        }
       
        echo 'Ilosc linijek w pliku'.$file->key(); 
 exit; 
   */

?>